/**
 * Ajax 를 이용하여 페이지를 이동하면 브라우저의 뒤로가기 버튼을 이용할 수 없다.
 * Ajax 로 페이지 전체를 리로딩하지 않으면서, 브라우저의 뒤로가기 버튼을 이용하기 위해
 * HTML5의 pushState를 사용.

 * 
 * ** 특이사항 **
 * 1. 이동할 페이지를 HTML Anchor(#) 을 이용하여 구현하였음.
 *    새로고침을 해도 현재 URL 을 표시하기 위하여
 *    onpageshow 이벤트에서 Anchor 값을 구분하여 페이지를 전환한다.
 * 
 * 2. Anchor 를 이용하였기 때문에 뒤로가기,앞으로가기를 사용하기 위해서
 *    onhashchange 이벤트를 사용하였다.
 * 3. 브라우저 history를 사용할 수 없는 ajax 페이지 이동에만 사용한다.
 * *************
 * 
 * ** 사용법 **
 * 1. history 에 pageId 와 url 을 등록한다.
 * 2. 실제로 페이지 전환시에 goUrl(pageId , e)를 사용한다. (history 에 이미 등록된 page 만 사용가능).
 * ***********
 * 
 * @author BJS aka Zephyr
 * @version 0.5
 * @date 2012-03-08
 * 
 */
var Hist = function() {
	this.initialize();
};

Hist.prototype = {
		pageList : null ,
		targetDiv : "" ,
		initialize : function() {
			this.pageList = new HashMap();
			var _this = this;
			
			window.onhashchange = function(e) {
				var thisUrl = e.newURL;
				var pageId = _this.getPageId(thisUrl);
				_this.ajaxGoUrl(pageId);
				_this.hashChangeCB();
			};
			
			window.onpageshow = function(e) {
				// e.srcElement 파이어폭스에서 안됨.
				// e.target 크롬 , 파이어폭스 지원.
				var thisUrl = e.target.URL;
				var pageId = _this.getPageId(thisUrl);
				_this.ajaxGoUrl(pageId);
				_this.pageShowCB();
			};
		} ,
		
		/**
		 * Hist 에 페이지를 등록한다.
		 * 등록하는 것으로는 아무런 효과가 없고, 
		 * 이벤트 발생시 goUrl 을 사용하여 등록된 pageId를 사용한다.
		 * 
		 * @param pageId : 등록된 키값. pageId값은 실제 url 에 #값으로 사용된다.
		 * @param url    : 키값을 사용하였을때 실제로 내용을 보여줄 url
		 * @param -- optional
		 * @param cbFunc : url 로의 이동이 끝난 후 실행할 콜백함수
		 * @param targetDiv : 내용을 보여줄 divId. 이 값이 없으면 그냥 실행만 하고 페이지에는 변화가 없다.
		 */
		addPage : function( pageId , url , cbFunc , targetDiv ) {
			if(!targetDiv) targetDiv = this.targetDiv;
			this.pageList.put(pageId, { 'url' : url , 'targetDiv' : targetDiv , 'cbFunc' : cbFunc });
		} ,
		setTargetDiv : function( targetDiv ) {
			this.targetDiv = targetDiv;
		} ,
		/**
		 * 실제로 page를 이동한다.
		 * @param pageId : 이미 등록된 pageId값
		 * @param -- optional
		 * @param e : 발생한 이벤트
		 */
		goUrl : function( pageId , e ) {
			if(e) e.preventDefault();
			history.pushState(pageId , 'title'+pageId , '#'+pageId);
			this.ajaxGoUrl(pageId);
		} , 
		ajaxGoUrl : function(pageId) {
			var pageInfo = this.pageList.get(pageId);
			var _this = this;
			if(pageInfo) {
				$.post( pageInfo.url , function(data) {
					if( pageInfo.targetDiv ) {
						$('#' + pageInfo.targetDiv).html(data);
					}
					else if( _this.targetDiv ) {
						$('#' + _this.targetDiv).html(data);
					}
					if( pageInfo.cbFunc ) pageInfo.cbFunc(data);
				} );
			}
		} ,
		getPageId : function(thisUrl) {
			var idx = thisUrl.lastIndexOf("#");
			var pageId = "";
			if(idx != -1) {
				pageId = thisUrl.substr( idx+1 );
			}
			return pageId;
		} ,
		hashChangeCB : function() {
			
		} ,
		pageShowCB : function() {
			
		}
};